﻿using System.Web.Mvc;
using zeus.Core;
using SharpArch.Web.NHibernate;
using SharpArch.Core;
using SharpArch.Core.PersistenceSupport;
using System.Collections.Generic;
using Webdiyer.WebControls.Mvc;
using System;
using System.Linq;
using zeus.Core.RepositoryInterfaces;
using zeus.Web.Controllers.Helpers;

namespace zeus.Web.Controllers
{
    [HandleError]
    public class PeopleController : Controller
    {
        
        private readonly IRepository<Cliente> clienteRepository;
        private readonly IUsuarioRepository usuarioRepository;
        private readonly IUbicacionRepository ubicacionRepository;
        private readonly IUnidadRepository unidadRepository;
        private readonly IGrupoUsuarioRepository grupoUsuarioRepository;
        private readonly IRepository<Ubicacion> ubicacionesRepository;
        private readonly IEventoRepository eventosRepository;

        public PeopleController(IRepository<Cliente> clienteRepository,
            IUsuarioRepository usuarioRepository, 
            IUbicacionRepository ubicacionRepository,
            IUnidadRepository unidadRepository,
            IGrupoUsuarioRepository grupoUsuarioRepository,
            IRepository<Ubicacion> ubicacionesRepository,
            IEventoRepository eventosRepository)
        {
        
       

            Check.Require(grupoUsuarioRepository != null, "grupoUsuarioRepository may not be null");
            this.grupoUsuarioRepository = grupoUsuarioRepository;

            Check.Require(usuarioRepository != null, "usuarioRepository may not be null");
            this.usuarioRepository = usuarioRepository;

            Check.Require(clienteRepository != null, "clienteRepository may not be null");
            this.clienteRepository = clienteRepository;

            Check.Require(ubicacionRepository != null, "ubicacionRepository may not be null");
            this.ubicacionRepository = ubicacionRepository;

            Check.Require(unidadRepository != null, "unidadRepository may not be null");
            this.unidadRepository = unidadRepository;

            Check.Require(ubicacionesRepository != null, "ubicacionesRepository may not be null");
            this.ubicacionesRepository = ubicacionesRepository;

            Check.Require(eventosRepository != null, "eventosRepository may not be null");
            this.eventosRepository = eventosRepository;
        }
        


        public WorkingSession workingSession
        {
            get
            {
                if (Session["WorkingSession"] == null)
                    throw new SessionExpiredException();

                return Session["WorkingSession"] as WorkingSession;
            }
            set
            {
                Session["WorkingSession"] = value;
            }
        }
         [Transaction]
        public ActionResult PantallaPrincipal(int? id)
        {
            try
            {
                IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuario(workingSession.Usuario.Id);
                PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 4);
                return View(ubicaciones);
                //return View();

            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }

        }

         [Transaction]
        public ActionResult PantallaSalud()
        {
            return View();

        }

        public ActionResult CrearEvento()
        {
            return View();

        }
         [Transaction]
        public ActionResult PantallaAtenderEvento()
        {
            return View();

        }

         [Transaction]
        public ActionResult Monitoreo(int? id)
        {

            try
            {
                IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuario(workingSession.Usuario.Id);
                PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 7);
                return View(ubicaciones);
                //return View();

            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }

        }
         [Transaction]
        public ActionResult MapaPeople()
        {
            return View();

        }
         [Transaction]
         public ActionResult PeopleMonitoreo(int ? Id)
        {
            List<object> datos = new List<object> { Id };
            return View(datos);

        }
        [Transaction]
        public ActionResult RetornaDatos(string  Id)
        {
            //return View();
           List<object> datos = new List<object> { Id };
            //object toda una lista del objeto ubicacion...selecciono los datos q dese y no todo el objeto 


           return View("PeopleMonitoreo", datos);

        }

        [Transaction, HttpPost]
        public ActionResult MapaUbicacion(string Id)
        {

            Ubicacion ubicacion = ubicacionRepository.GetPosicionPorId(Id);
            List<object> coordenadas = new List<object> { ubicacion.Latitud, ubicacion.Longitud, 
                ubicacion.Fecha, ubicacion.Unidad.Nombre, ubicacion.Unidad.Placa, ubicacion.Velocidad, ubicacion.Grados,ubicacion.CodigoEvento,ubicacion.Evento.Nombre };
            //object toda una lista del objeto ubicacion....selecciono los datos q dese y no todo el objeto 
            return Json(coordenadas);


        }


    }
}
